www.gusucode.com > matlab最优化程序源码---书籍 > matlab最优化程序/光盘程序/第13章 粒子群优化算法/CLSPSO.m

    function [xm,fv] = CLSPSO(fitness,N,c1,c2,w,xmax,xmin,M,MaxC,D)

format long;

%------初始化种群的个体------------

for i=1:N

    for j=1:D

        x(i,j)=randn;  %随机初始化位置

        v(i,j)=randn;  %随机初始化速度

    end

end

%------先计算各个粒子的适应度,并初始化Pi和Pg----------------------

for i=1:N

    p(i)=fitness(x(i,:));

    y(i,:)=x(i,:);

end

pg = x(N,:);             %Pg为全局最优

for i=1:(N-1)

    if fitness(x(i,:))<fitness(pg)

        pg=x(i,:);

    end

end

%------进入主要循环,按照公式依次迭代------------

for t=1:M
   
    for i=1:N
        
        v(i,:)=w*v(i,:)+c1*rand*(y(i,:)-x(i,:))+c2*rand*(pg-x(i,:));

        x(i,:)=x(i,:)+v(i,:);
        
        fv(i) = fitness(x(i,:));
        
    end
    
    [sort_fv,index] = sort(fv);
    
    Nbest = floor(N*0.2); 
    
    for n=1:Nbest
        
        tmpx = x(index(n),:);
        
        for k=1:MaxC
            
            for dim=1:D
                
                cx(dim) = (tmpx(1,dim) - xmin(dim))/(tmpx(1,dim) - xmax(dim));
                
                cx(dim) = 4*cx(dim)*(1 - cx(dim));
                
                tmpx(1,dim) = tmpx(1,dim) + cx(dim)*(xmax(dim) - xmin(dim));
                
            end
            
            fcs = fitness(tmpx);
            
            if fcs < sort_fv(n)
                
                x(index(n),:) = tmpx;
                
                break;
                
            end
                       
        end
         
        x(index(n),:) = tmpx;
        
    end
    
    r = rand();
    
    for s=1:D
        
        xmin(s) = max(xmin(s) , pg(s) - r*(xmax(s) - xmin(s)));
        
        xmax(s) = min(xmax(s) , pg(s) + r*(xmax(s) - xmin(s)));
        
    end
    
    x(1:Nbest, :) = x(index(1:Nbest),:);
    
    for i=(Nbest+1):N

        for j=1:D

            x(i,j)= xmin(j) + rand*(xmax(j) - xmin(j));  %随机初始化位置

            v(i,j)= randn;  %随机初始化速度

        end

    end
    
    Pbest(t)=fitness(pg);
    
    for i=1:N

        if fitness(x(i,:))<p(i)

            p(i)=fitness(x(i,:));

            y(i,:)=x(i,:);
            
        end


        if p(i)<fitness(pg)

            pg=y(i,:);

        end
        
    end

end

xm = pg';

fv = fitness(pg);